<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="coinfaces">

        <title>系统引导</title>

    <link rel="stylesheet" href="../../../theme/css/style.css">
    <link rel="stylesheet" href="../../../theme/css/pygments.css">



</head>

<body>
    <div class="content">
<h1>系统引导</h1>
    <div class="section" id="grub2-legacy">
<h2>GRUB2 Legacy</h2>
<p>安装GRUB2引导程序（假设启动分区位于 /mnt/boot）</p>
<pre class="literal-block">
grub2-install --boot-directory=/mnt/boot /dev/sdX
</pre>
<p>将GRUB2配置文件复制到 /mnt/boot/grub/grub.cfg</p>
</div>
<div class="section" id="grub2-uefi">
<h2>GRUB2 UEFI</h2>
<p>创建UEFI启动文件（假设EFI系统分区被挂载到 /mnt）</p>
<pre class="literal-block">
grub-mkimage -o /mnt/efi/debian/bootx64.efi -p /efi/debian -O x86_64-efi \
    fat iso9660 part_gpt part_msdos \
    normal boot linux configfile loopback chain \
    efifwsetup efi_gop efi_uga \
    ls search search_label search_fs_uuid search_fs_file \
    gfxterm gfxterm_background gfxterm_menu echo test all_video loadenv \
    exfat ext2 ntfs btrfs hfsplus udf
</pre>
<p>将GRUB2配置文件复制到 /mnt/efi/debian/grub.cfg</p>
</div>
<div class="section" id="id2">
<h2>默认启动上一次选择的操作系统</h2>
<p>参考 <a class="reference external" href="https://www.gnu.org/software/grub/manual/grub/grub.html#Simple-configuration">GRUB2 文档</a>，用下面的命令生成的 grub.cfg 经过测试不能达到预期的效果，可能是没有正确理解文档的意思。</p>
<pre class="literal-block">
sudo env GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true grub-mkconfig &gt;grub.cfg
</pre>
<p>生成的 grub.cfg 里的部分代码经过修改提炼得到了下面的解决方案。</p>
<p>GRUB2 利用 <a class="reference external" href="https://www.gnu.org/software/grub/manual/grub/grub.html#Environment-block">Environment Block</a> 保存持久信息，在 grub.cfg 的开头加载 Environment：</p>
<pre class="literal-block">
if [ -s $prefix/grubenv ]; then
    set have_grubenv=true
    load_env
fi
</pre>
<p>这里 <tt class="docutils literal">$prefix</tt> 代表什么并不清楚，依照前面 GRUB2 UEFI 的设置，将 grubenv 文件放置在 /mnt/efi/debian/ 目录可以正常工作，猜测 GRUB2 Legacy 也需将 grubenv 文件放置在 grub.cfg 所在的目录。</p>
<p>接下来根据 Environment 里保存的信息设置 <tt class="docutils literal">default</tt> 变量，这里随意选择了 <tt class="docutils literal">next_entry</tt> 这个变量来保存菜单项：</p>
<pre class="literal-block">
if [ &quot;${next_entry}&quot; ] ; then
    set default=&quot;${next_entry}&quot;
else
    set default=&quot;0&quot;
fi
</pre>
<p>创建保存菜单项的命令与之对应：</p>
<pre class="literal-block">
function savedefault {
    next_entry=&quot;${chosen}&quot;
    save_env next_entry
}
</pre>
<p>最后将 <tt class="docutils literal">savedefault</tt> 命令添加到需要被保存的菜单项的命令列表中。</p>
</div>

    </div>
<nav class="nav sidebar">
    <div class="siteinfo">
        <div class="sitename"><a href="../../..">coinfaces</a></div>
        <div class="tagline">Another Side of Life</div>
    </div>

            <a href="../../../pages/doc/">&larr; 文档</a>

</nav><footer class="footer">
    <span>
        &copy; jpli &middot;
        under <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">CC-BY-SA 4.0</a>
    </span>
    |
    <span>
        Powered by:
        <a href="http://blog.getpelican.com/">Pelican</a>
    </span>
</footer></body>
</html>